package org.edu.common.utils;

import cn.hutool.core.bean.BeanUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

/**
 * 工具包-转换
 *

 * @version 1.0
 * @since 2020/7/8
 */
@Slf4j
public class ConvertUtils {
    /**
     * 转换为目标对象
     *
     * @param t      数据源
     * @param rClass 目标类
     * @return 目标对象

     * @since 2020-07-08
     */
    public static <T, R> R convertToDto(T t, Class<R> rClass) {
        if (t == null) {
            return null;
        }
        try {
            R r = rClass.newInstance();
            BeanUtil.copyProperties(t, r);
            return r;
        } catch (InstantiationException | IllegalAccessException e) {
            log.error(e.getMessage(), t);
            return null;
        }
    }

    /**
     * 转换为目标对象
     *
     * @param t      数据源
     * @param rClass 目标类
     * @param action 转换后操作
     * @return 目标对象

     * @since 2020-07-08
     */
    public static <T, R> R convertToDto(T t, Class<R> rClass, Consumer<R> action) {
        R r = convertToDto(t, rClass);
        action.accept(r);
        return r;
    }

    /**
     * 转换为目标对象列表
     *
     * @param list   数据源列表
     * @param rClass 目标类
     * @return 目标对象

     * @since 2020-07-08
     */
    public static <T, R> List<R> convertToDto(List<T> list, Class<R> rClass) {
        List<R> dtoList = new ArrayList<>();
        for (T t : list) {
            dtoList.add(convertToDto(t, rClass));
        }
        return dtoList;
    }

    /**
     * 转换为目标对象列表
     *
     * @param list   数据源列表
     * @param rClass 目标类
     * @return 目标对象

     * @since 2020-07-08
     */
    public static <T, R> List<R> convertToDto(List<T> list, Class<R> rClass, Consumer<R> action) {
        List<R> dtoList = new ArrayList<>();
        for (T t : list) {
            dtoList.add(convertToDto(t, rClass, action));
        }
        return dtoList;
    }
}
